

/**
 * https://leetcode.cn/problems/remove-element/
 * 
 * 题目：
 * 给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素，并返回移除后数组的新长度。
不要使用额外的数组空间，你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

方法：
1.双指针（最优解），O(N)
2.把元素替换到后面，然后再移除，需要额外空间

解题思路：
1.从后往前找，找到相同的就和当前元素交换，然后移除


总结：
为什么没有想到用双指针，因为原来以为删除每个元素要保留数组的完整性
双指针的第二个指针直接指向的位置，前面都是没有需要删除的元素，所以完整。

 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement2 = function(nums, val) {
    
    let i=nums.length-1;
    while(i>=0){
        if(nums[i]===val){
            // 当前元素和最后一个元素对换
            const lastIndex=nums.length-1
            
            const temp=nums[i];
            nums[i]=nums[lastIndex];
            nums[lastIndex]=temp;
           
                nums.pop();
               // console.log(nums.length)
            //}
            
        }
        i--;
    }
    
    console.log(nums,nums.length)
    
};



//1.数组删除元素（一个指针历遍可以用来找出数组的相同元素，另外一个指针指向最后可以替换的位置，最后返回第2个指针）
var removeElement = function(nums, val) {
    
    let i=0;//指向当前位置，这个先跑，找到相同的，就把元素替换到j位置上去。
    let j=0;//指向准备被替换的元素位置
    while(i<nums.length){
        console.log(nums,i,j)
        if(nums[i]!==val){
            nums[j++]=nums[i]; 
        }
        i++;
    }

    console.log(nums,j)
    return j;
};


removeElement(['a','b','a','c','d','a'],'a')